package com.gewu.pm.ui.activity.filter.base;

import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.blankj.utilcode.util.LogUtils;
import com.gewu.pm.R;
import com.gewu.pm.app.AppActivity;
import com.gewu.pm.ui.activity.filter.bean.FilterResultBean;
import com.gewu.pm.ui.activity.filter.config.FilterConfig;
import com.gewu.pm.ui.activity.filter.manager.FilterManager;
import com.gewu.pm.utils.eventbus.EventBean;
import com.gewu.pm.utils.eventbus.EventBusUtil;
import com.gewu.pm.utils.eventbus.EventCode;

import java.util.Map;

/**
 * 筛选Activity基类
 * 
 * 功能：
 * - 使用组合方式，通过FilterManager管理筛选逻辑
 * - 提供统一的重置和确认按钮
 * - 点击确认时收集筛选数据并返回给调用页面
 * 
 * 使用方式：
 * 1. 继承此类
 * 2. 实现 getFilterConfig() 方法返回筛选配置
 * 3. 可选重写 onFilterConfirm() 方法处理筛选结果
 * 
 * @author AI Assistant
 * @since 1.0
 */
public abstract class BaseFilterActivity extends AppActivity {
    
    private static final String TAG = "BaseFilterActivity";
    
    private LinearLayout mFilterContainer;
    private TextView mTvReset;
    private TextView mTvConfirm;
    
    private FilterManager mFilterManager;
    
    @Override
    protected int getLayoutId() {
        return R.layout.base_filter_activity;
    }
    
    @Override
    protected void initView(Bundle savedInstanceState) {
        mFilterContainer = findViewById(R.id.ll_filter_container);
        mTvReset = findViewById(R.id.tv_reset);
        mTvConfirm = findViewById(R.id.tv_confirm);
        
        // 初始化FilterManager
        mFilterManager = new FilterManager(this, mFilterContainer);
        
        // 设置点击事件
        setOnClickListener(mTvReset, mTvConfirm);
    }
    
    @Override
    protected void initData() {
        // 获取配置并初始化
        FilterConfig config = getFilterConfig();
        if (config != null) {
            mFilterManager.init(config);
        }
    }
    
    @Override
    public void onClick(View view) {
        int viewId = view.getId();
        if (viewId == R.id.tv_reset) {
            // 重置所有筛选条件
            mFilterManager.reset();
            toast("已重置");
            
        } else if (viewId == R.id.tv_confirm) {
            // 收集筛选数据
            Map<String, Object> data = mFilterManager.collectData();
            
            // 打印日志（用于调试）
            printFilterData(data);
            
            // 回调给子类处理
            onFilterConfirm(data);
            
            // 返回数据给调用页面
            returnFilterData(data);
        }
    }
    
    /**
     * 打印筛选数据到日志
     * 
     * @param data 筛选数据
     */
    private void printFilterData(Map<String, Object> data) {
        String className = getClass().getSimpleName();
        LogUtils.d(TAG, "========== " + className + " 筛选数据 ==========");
        
        if (data.isEmpty()) {
            LogUtils.d(TAG, "未选择任何筛选条件");
        } else {
            for (Map.Entry<String, Object> entry : data.entrySet()) {
                String key = entry.getKey();
                Object value = entry.getValue();
                
                // 格式化输出，便于查看
                String valueStr = value != null ? value.toString() : "null";
                LogUtils.d(TAG, String.format("%-20s = %s", key, valueStr));
            }
        }

        LogUtils.d(TAG, "==========================================");
    }
    
    /**
     * 返回筛选数据给调用页面
     * 
     * 使用项目统一的EventBus工具类发送事件
     * 
     * 优势：
     * - 不需要使用startActivityForResult和onActivityResult
     * - 解耦调用页面和筛选页面
     * - 支持多个页面同时监听
     * - 符合项目EventBus使用规范
     * 
     * @param data 筛选数据
     */
    private void returnFilterData(Map<String, Object> data) {
        // 获取当前Activity的类名
        String pageName = getClass().getSimpleName();
        
        // 创建筛选结果数据
        FilterResultBean resultBean = new FilterResultBean(pageName, data);
        
        // 通过EventBusUtil发送事件
        EventBusUtil.sendEvent(new EventBean<>(EventCode.FILTER_RESULT, resultBean));
        
        // 打印发送日志
        LogUtils.d(TAG, "EventBus发送事件: code=" + EventCode.FILTER_RESULT + ", data=" + resultBean.toString());
        
        // 关闭页面
        finish();
    }
    
    /**
     * 子类必须实现：返回筛选配置
     * 
     * 示例：
     * <pre>
     * return new FilterConfig.Builder()
     *         .addTextSelector("sales_area", "销售区域", "请选择销售区域", SelectorType.SALES_REGION)
     *         .addTimeSelector("submit_time", "提交时间", 3)
     *         .build();
     * </pre>
     * 
     * @return 筛选配置
     */
    protected abstract FilterConfig getFilterConfig();
    
    /**
     * 子类可选实现：筛选确认回调
     * 
     * 用途：
     * - 在返回数据前进行额外处理
     * - 验证筛选数据
     * - 发送网络请求等
     * 
     * 注意：
     * - 此方法在 returnFilterData() 之前调用
     * - 如果需要阻止返回，可以在此方法中调用 return
     * 
     * @param data 筛选数据，key-value格式
     */
    protected void onFilterConfirm(Map<String, Object> data) {
        // 默认实现：什么都不做
        // 子类可以重写此方法处理筛选结果
    }
}
